﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using SistemaGO_Library.Entidades.Pedido;
using SistemaGO_Library.Entidades.Proposta;
using SistemaGO_Library.Entidades.Ocorrencia;
using SistemaGO_Library.Entidades.Terceiro;
using SistemaGO_Library;

namespace SistemaGO_Desktop.Visao.Telas
{
    public partial class frmPedidoProposta : Form
    {
        private static frmPedidoProposta instancia = null;
        private Fachada fachada;
        public Pedido pedido;
        private Ocorrencia ocorrencia;
        int codigo_pedido;


        public frmPedidoProposta()
        {
            //instanciando as atributos que serão utilizados
            pedido = new Pedido();
            fachada = Fachada.getInstance();
            ocorrencia = new Ocorrencia();

            //"construtor" dos compenentes
            InitializeComponent();
        }

        public static frmPedidoProposta getInstance()
        {
            if (instancia == null)
            {
                instancia = new frmPedidoProposta();
            }
            else
            {
                instancia.Focus();
            }
            return instancia;
        }

        private void frmPedidoProposta_FormClosing(object sender, FormClosingEventArgs e)
        {
            instancia = null;
        }

        private void frmPedidoProposta_Load(object sender, EventArgs e)
        {
            if (!this.pedido.Ocorrencia_cod.Equals(0))
            {
                //buscando a ocorrencia em questão
                ocorrencia = fachada.buscarOcorrencia(pedido.Ocorrencia_cod);

                //preenchendo os dados da ocorrencia
                tbPedidoAvRuaOcorrencia.Text = ocorrencia.Ocorrencia_av_rua;
                tbPedidoCodigoOcorrencia.Text = pedido.Ocorrencia_cod.ToString();
                tbPedidoEmailOcorrencia.Text = ocorrencia.Denunciante_email;
                tbPedidoNomeOcorrencia.Text = ocorrencia.Denunciante_nome;
                tbPedidoPontoDeReferenciaOcorrencia.Text = ocorrencia.Ocorrencia_ponto_ref;
                tbPedidoCodigoPedido.Text = "";
                mtbPedidoCelularOcorrencia.Text = ocorrencia.Denunciante_celular;
                mtbPedidoCepOcorrencia.Text = ocorrencia.Ocorrencia_cep;
                try
                {
                    pbPedidoImagemOcorrencia.Image = Image.FromFile(ocorrencia.Ocorrencia_imagem);
                }
                catch
                {
                    MessageBox.Show("Imagem não encontrada!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                    pbPedidoImagemOcorrencia.SizeMode = PictureBoxSizeMode.StretchImage;

                if(ocorrencia.Ocorrencia_envio.Equals("E")){
                    rbPedidoEnvioEmailOcorrencia.Checked = true;
                }else if(ocorrencia.Ocorrencia_envio.Equals("C")){
                    rbPedidoEnvioCelularOcorrencia.Checked = true;
                }

                this.validarPedido();
                
            }
            else
            {
                MessageBox.Show("erro: falha ao buscar a ocorrencia, ocorrência com código inválido.", "Falha na Busca", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btFazerPedido_Click(object sender, EventArgs e)
        {
            fachada.mudarSituacaoPedido("A", int.Parse(tbPedidoCodigoPedido.Text));
            btFazerPedido.Enabled     = false;
            btExcluirPedido.Enabled   = false;
            btEditarPedido.Enabled    = false;
            btAdicionarPedido.Enabled = false;

            MessageBox.Show("Pedido lançando com sucesso, para visualizar as propostas clique na aba \"proposta\" acima.", "Pedido Gerado", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            tbPedidoCodigoPedido.Enabled     = false;
            tbPedidoObservacaoPedido.Enabled = false;
            dtpPedidoDataFinalPedido.Enabled = false;
        }

        private bool validarPedido() {
            bool retorno = false;
            //validando se ja existe um pedido em aberto para a ocorrencia
            if (fachada.validarPedido(ocorrencia.Ocorrencia_cod))//ocorrencia sem pedidos
            {
                dtpPedidoDataFinalPedido.Enabled = true;
                tbPedidoObservacaoPedido.Enabled = true;
                
                btAdicionarPedido.Enabled        = true;
                
                retorno = true; 
            }
            else
            { //ocorrencia com pedidos
                
                dtpPedidoDataFinalPedido.Enabled = false;
                tbPedidoObservacaoPedido.Enabled = false;
                tbPedidoCodigoPedido.Enabled     = false;
                btFazerPedido.Enabled            = false;
                tcPedidoProposta.SelectTab(1);

                //buscando o codigo do pedido que esta ativo para essa ocorrencia
                codigo_pedido = fachada.pedidoDaOcorrencia(ocorrencia.Ocorrencia_cod);

                try
                {
                    Pedido pedido = fachada.buscarPedido(codigo_pedido);
                    tbPedidoObservacaoPedido.Text = pedido.Pedido_observacao;
                    tbPedidoCodigoPedido.Text = pedido.Pedido_cod.ToString();
                    dtpPedidoDataFinalPedido.Text = pedido.Pedido_data_final.ToString();
                    gerarPropostas(codigo_pedido);
                }catch{}

                
            }
            return retorno;
       }

        private void gerarPropostas(int codigo_pedido) {
            //buscando as propostas para o pedido
            if (codigo_pedido != -1)
            {
                ArrayList propostas = new ArrayList();
                lbPropostasListadas.Items.Clear();

                propostas = fachada.propostasDoPedido(codigo_pedido);

                if (propostas.Count > 0)
                {
                    btPropostasAtualizar.Enabled = true;
                    btPropostaAceitar.Enabled = true;
                    cbPropostaSituacao.Enabled = true;
                }
                else {
                    btPropostaAceitar.Enabled = false;
                    cbPropostaSituacao.Enabled = false;
                }

                for (int i = 0; i < propostas.Count; i++)
                {
                    //buscando o nome do terceiro responsavel pela proposta
                    Terceiro terceiro = fachada.buscarTerceiro(((Proposta)propostas[i]).Terc_cod);

                    //adicionando as propostas ao listbox
                    lbPropostasListadas.Items.Add(((Proposta)propostas[i]).Proposta_cod + " - " + terceiro.Terc_nome);
                }

            }
            else
            {
                MessageBox.Show("erro: falha ao buscar o pedido da ocorrência, ocorrencia sem pedido atribuído.", "Falha na Busca", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btAdicionarPedido_Click(object sender, EventArgs e)
        {
            if (tbPedidoObservacaoPedido.Text.Trim().Equals("")) {
                MessageBox.Show("Campo \"Observação\" é obrigatório.", "Campo em branco", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbPedidoObservacaoPedido.Focus();
                return;
            }
            
            Pedido pedido = new Pedido();
            pedido.Pedido_data_final = DateTime.Parse(dtpPedidoDataFinalPedido.Text);
            pedido.Pedido_observacao = tbPedidoObservacaoPedido.Text;
            pedido.Ocorrencia_cod = ocorrencia.Ocorrencia_cod;
            pedido.Situacao = "N";

            fachada.inserirPedido(pedido);

            MessageBox.Show("Pedido gerado com sucesso! Verifique os dados e clique no botão \"Fazer Pedido\" para validar.", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            tbPedidoCodigoPedido.Text = (fachada.buscarCodigoPedido() - 1).ToString();
            
            btFazerPedido.Enabled     = true;
            btEditarPedido.Enabled    = true;
            btAdicionarPedido.Enabled = false;
        }

        private void btEditarPedido_Click(object sender, EventArgs e)
        {
            Pedido novo_pedido = new Pedido();
            novo_pedido.Situacao = "N";
            novo_pedido.Pedido_observacao = tbPedidoObservacaoPedido.Text;
            novo_pedido.Pedido_data_final = DateTime.Parse(dtpPedidoDataFinalPedido.Text);
            novo_pedido.Ocorrencia_cod = ocorrencia.Ocorrencia_cod;

            fachada.alterarPedido(int.Parse(tbPedidoCodigoPedido.Text),novo_pedido);

            MessageBox.Show("Pedido alterado com sucesso! Verifique os dados novamente e clique no botão \"Fazer Pedido\".", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        private void btPropostasAtualizar_Click(object sender, EventArgs e)
        {
            gerarPropostas(codigo_pedido);
        }

        private void lbPropostasListadas_SelectedIndexChanged(object sender, EventArgs e)
        {
            int indice = lbPropostasListadas.SelectedIndex;
            string escolhido = lbPropostasListadas.Text;
            int maxLen = escolhido.IndexOf("-") - 1;

            gerarPropostas(codigo_pedido);

            if (lbPropostasListadas.Items.Count==0) {
                return;
            }

            escolhido = escolhido.Substring(0, maxLen);

            int codigo = int.Parse(escolhido);
            Proposta proposta = new Proposta();
            Terceiro terceiro = new Terceiro();

            proposta = fachada.buscarProposta(codigo);
            terceiro = fachada.buscarTerceiro(proposta.Terc_cod);

            tbPropostaCodigo.Text = codigo.ToString();
            tbPropostaPedidoCod.Text = proposta.Pedido_cod.ToString();
            tbPropostaPrazo.Text = proposta.Proposta_prazo.ToString();
            tbPropostaTerceiro.Text = terceiro.Terc_cnpj + " - " + terceiro.Terc_nome;
            tbValorProposta.Text = proposta.Proposta_valor.ToString();
            tbPedidoObservacao.Text = proposta.Proposta_observacao;
        }

        private void btPropostaAceitar_Click(object sender, EventArgs e)
        {
            if (!cbPropostaSituacao.Text.Equals("selecione") && (cbPropostaSituacao.Text.Equals("Aceitar") || cbPropostaSituacao.Text.Equals("Recusar")))
            {
                if (cbPropostaSituacao.Text.Equals("Aceitar"))
                {
                    fachada.aceitarProposta(int.Parse(tbPropostaCodigo.Text), int.Parse(tbPedidoCodigoPedido.Text));
                    fachada.mudarSituacaoPedido("F", int.Parse(tbPedidoCodigoPedido.Text));
                    fachada.mudarSituacaoOcorrencia("T", int.Parse(tbPedidoCodigoOcorrencia.Text));

                    btPropostaAceitar.Enabled = false;
                    cbPropostaSituacao.Enabled = false;
                    MessageBox.Show("Proposta aceita!", "Aceitar", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    frmVerificarOcorrencias frm = frmVerificarOcorrencias.getInstance();
                    frm.filtrarOcorrencias();
                    this.Close();
                }
                else {
                    fachada.mudarSituacaoProposta("R", int.Parse(tbPropostaCodigo.Text));
                    MessageBox.Show("Proposta recusada!", "Recusar", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    gerarPropostas(codigo_pedido);
                    tbPropostaCodigo.Text = null;
                    tbPropostaPedidoCod.Text = null;
                    dtpPropostaDataEnvio.Text = DateTime.Now.ToString(); 
                    tbPropostaPrazo.Text = null;
                    tbPropostaTerceiro.Text = null;
                    tbValorProposta.Text = null;
                    tbPedidoObservacao.Text = null;
                }
            }
            else {
                MessageBox.Show("Selecione uma situação válida, verifique se você escolheu uma situação válida para essa proposta.", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cbPropostaSituacao.Focus();
            }
        }


    }
}